//package chapter01.source04;
//
//import java.io.*;
//import java.util.Date;
//import java.awt.*;
//import java.awt.event.*;
//import javax.swing.*;
//import javax.swing.event.*;
//
///************************************/
//class FileOperation
//{
//    Notepad npd;
//
//    boolean saved;
//    boolean newFileFlag;
//    String fileName;
//    String applicationTitle="Notepad - JavaTpoint";
//
//    File fileRef;
//    JFileChooser chooser;
//    /////////////////////////////
//    boolean isSave(){return saved;}
//    void setSave(boolean saved){this.saved=saved;}
//    String getFileName(){return new String(fileName);}
//    void setFileName(String fileName){this.fileName=new String(fileName);}
//    /////////////////////////
//    FileOperation(Notepad npd)
//    {
//        this.npd=npd;
//
//        saved=true;
//        newFileFlag=true;
//        fileName=new String("Untitled");
//        fileRef=new File(fileName);
//        this.npd.f.setTitle(fileName+" - "+applicationTitle);
//
//        chooser=new JFileChooser();
//        chooser.addChoosableFileFilter(new MyFileFilter(".java","Java Source Files(*.java)"));
//        chooser.addChoosableFileFilter(new MyFileFilter(".txt","Text Files(*.txt)"));
//        chooser.setCurrentDirectory(new File("."));
//
//    }
////////////////////////////////////////
//
//    boolean saveFile(File temp)
//    {
//        FileWriter fout=null;
//        try
//        {
//            fout=new FileWriter(temp);
//            fout.write(npd.ta.getText());
//        }
//        catch(IOException ioe){updateStatus(temp,false);return false;}
//        finally
//        {try{fout.close();}catch(IOException excp){}}
//        updateStatus(temp,true);
//        return true;
//    }
//    ////////////////////////
//    boolean saveThisFile()
//    {
//
//        if(!newFileFlag)
//        {return saveFile(fileRef);}
//
//        return saveAsFile();
//    }
//    ////////////////////////////////////
//    boolean saveAsFile()
//    {
//        File temp=null;
//        chooser.setDialogTitle("Save As...");
//        chooser.setApproveButtonText("Save Now");
//        chooser.setApproveButtonMnemonic(KeyEvent.VK_S);
//        chooser.setApproveButtonToolTipText("Click me to save!");
//
//        do
//        {
//            if(chooser.showSaveDialog(this.npd.f)!=JFileChooser.APPROVE_OPTION)
//                return false;
//            temp=chooser.getSelectedFile();
//            if(!temp.exists()) break;
//            if(   JOptionPane.showConfirmDialog(
//                    this.npd.f,"<html>"+temp.getPath()+" already exists.<br>Do you want to replace it?<html>",
//                    "Save As",JOptionPane.YES_NO_OPTION
//            )==JOptionPane.YES_OPTION)
//                break;
//        }while(true);
//
//
//        return saveFile(temp);
//    }
//
//    ////////////////////////
//    boolean openFile(File temp)
//    {
//        FileInputStream fin=null;
//        BufferedReader din=null;
//
//        try
//        {
//            fin=new FileInputStream(temp);
//            din=new BufferedReader(new InputStreamReader(fin));
//            String str=" ";
//            while(str!=null)
//            {
//                str=din.readLine();
//                if(str==null)
//                    break;
//                this.npd.ta.append(str+"\n");
//            }
//
//        }
//        catch(IOException ioe){updateStatus(temp,false);return false;}
//        finally
//        {try{din.close();fin.close();}catch(IOException excp){}}
//        updateStatus(temp,true);
//        this.npd.ta.setCaretPosition(0);
//        return true;
//    }
//    ///////////////////////
//    void openFile()
//    {
//        if(!confirmSave()) return;
//        chooser.setDialogTitle("Open File...");
//        chooser.setApproveButtonText("Open this");
//        chooser.setApproveButtonMnemonic(KeyEvent.VK_O);
//        chooser.setApproveButtonToolTipText("Click me to open the selected file.!");
//
//        File temp=null;
//        do
//        {
//            if(chooser.showOpenDialog(this.npd.f)!=JFileChooser.APPROVE_OPTION)
//                return;
//            temp=chooser.getSelectedFile();
//
//            if(temp.exists())   break;
//
//            JOptionPane.showMessageDialog(this.npd.f,
//                    "<html>"+temp.getName()+"<br>file not found.<br>"+
//                            "Please verify the correct file name was given.<html>",
//                    "Open", JOptionPane.INFORMATION_MESSAGE);
//
//        } while(true);
//
//        this.npd.ta.setText("");
//
//        if(!openFile(temp))
//        {
//            fileName="Untitled"; saved=true;
//            this.npd.f.setTitle(fileName+" - "+applicationTitle);
//        }
//        if(!temp.canWrite())
//            newFileFlag=true;
//
//    }
//    ////////////////////////
//    void updateStatus(File temp,boolean saved)
//    {
//        if(saved)
//        {
//            this.saved=true;
//            fileName=new String(temp.getName());
//            if(!temp.canWrite())
//            {fileName+="(Read only)"; newFileFlag=true;}
//            fileRef=temp;
//            npd.f.setTitle(fileName + " - "+applicationTitle);
//            npd.statusBar.setText("File : "+temp.getPath()+" saved/opened successfully.");
//            newFileFlag=false;
//        }
//        else
//        {
//            npd.statusBar.setText("Failed to save/open : "+temp.getPath());
//        }
//    }
//    ///////////////////////
//    boolean confirmSave()
//    {
//        String strMsg="<html>The text in the "+fileName+" file has been changed.<br>"+
//                "Do you want to save the changes?<html>";
//        if(!saved)
//        {
//            int x=JOptionPane.showConfirmDialog(this.npd.f,strMsg,applicationTitle,
//                    JOptionPane.YES_NO_CANCEL_OPTION);
//
//            if(x==JOptionPane.CANCEL_OPTION) return false;
//            if(x==JOptionPane.YES_OPTION && !saveAsFile()) return false;
//        }
//        return true;
//    }
//    ///////////////////////////////////////
//    void newFile()
//    {
//        if(!confirmSave()) return;
//
//        this.npd.ta.setText("");
//        fileName=new String("Untitled");
//        fileRef=new File(fileName);
//        saved=true;
//        newFileFlag=true;
//        this.npd.f.setTitle(fileName+" - "+applicationTitle);
//    }
////////////////////////////////////////
//}// end defination of class FileOperation
///************************************/
//public class Notepad  implements ActionListener, MenuConstants
//{
//
//    JFrame f;
//    JTextArea ta;
//    JLabel statusBar;
//
//    private String fileName="Untitled";
//    private boolean saved=true;
//    String applicationName="Javapad";
//
//    String searchString, replaceString;
//    int lastSearchIndex;
//
//    FileOperation fileHandler;
//    FontChooser fontDialog=null;
//    FindDialog findReplaceDialog=null;
//    JColorChooser bcolorChooser=null;
//    JColorChooser fcolorChooser=null;
//    JDialog backgroundDialog=null;
//    JDialog foregroundDialog=null;
//    JMenuItem cutItem,copyItem, deleteItem, findItem, findNextItem,
//            replaceItem, gotoItem, selectAllItem;
//    /****************************/
//    Notepad()
//    {
//        f=new JFrame(fileName+" - "+applicationName);
//        ta=new JTextArea(30,60);
//        statusBar=new JLabel("||       Ln 1, Col 1  ",JLabel.RIGHT);
//        f.add(new JScrollPane(ta),BorderLayout.CENTER);
//        f.add(statusBar,BorderLayout.SOUTH);
//        f.add(new JLabel("  "),BorderLayout.EAST);
//        f.add(new JLabel("  "),BorderLayout.WEST);
//        createMenuBar(f);
////f.setSize(350,350);
//        f.pack();
//        f.setLocation(100,50);
//        f.setVisible(true);
//        f.setLocation(150,50);
//        f.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
//
//        fileHandler=new FileOperation(this);
//
///////////////////////
//
//        ta.addCaretListener(
//                new CaretListener()
//                {
//                    public void caretUpdate(CaretEvent e)
//                    {
//                        int lineNumber=0, column=0, pos=0;
//
//                        try
//                        {
//                            pos=ta.getCaretPosition();
//                            lineNumber=ta.getLineOfOffset(pos);
//                            column=pos-ta.getLineStartOffset(lineNumber);
//                        }catch(Exception excp){}
//                        if(ta.getText().length()==0){lineNumber=0; column=0;}
//                        statusBar.setText("||       Ln "+(lineNumber+1)+", Col "+(column+1));
//                    }
//                });
////////////////////
//        DocumentListener myListener = new DocumentListener()
//        {
//            public void changedUpdate(DocumentEvent e){fileHandler.saved=false;}
//            public void removeUpdate(DocumentEvent e){fileHandler.saved=false;}
//            public void insertUpdate(DocumentEvent e){fileHandler.saved=false;}
//        };
//        ta.getDocument().addDocumentListener(myListener);
///////////
//        WindowListener frameClose=new WindowAdapter()
//        {
//            public void windowClosing(WindowEvent we)
//            {
//                if(fileHandler.confirmSave())System.exit(0);
//            }
//        };
//        f.addWindowListener(frameClose);
////////////////////
///*
//ta.append("Hello dear hello hi");
//ta.append("\nwho are u dear mister hello");
//ta.append("\nhello bye hel");
//ta.append("\nHello");
//ta.append("\nMiss u mister hello hell");
//fileHandler.saved=true;
//*/
//    }
//    ////////////////////////////////////
//    void goTo()
//    {
//        int lineNumber=0;
//        try
//        {
//            lineNumber=ta.getLineOfOffset(ta.getCaretPosition())+1;
//            String tempStr=JOptionPane.showInputDialog(f,"Enter Line Number:",""+lineNumber);
//            if(tempStr==null)
//            {return;}
//            lineNumber=Integer.parseInt(tempStr);
//            ta.setCaretPosition(ta.getLineStartOffset(lineNumber-1));
//        }catch(Exception e){}
//    }
//    ///////////////////////////////////
//    public void actionPerformed(ActionEvent ev)
//    {
//        String cmdText=ev.getActionCommand();
//////////////////////////////////////
//        if(cmdText.equals(fileNew))
//            fileHandler.newFile();
//        else if(cmdText.equals(fileOpen))
//            fileHandler.openFile();
//////////////////////////////////////
//        else if(cmdText.equals(fileSave))
//            fileHandler.saveThisFile();
//////////////////////////////////////
//        else if(cmdText.equals(fileSaveAs))
//            fileHandler.saveAsFile();
//////////////////////////////////////
//        else if(cmdText.equals(fileExit))
//        {if(fileHandler.confirmSave())System.exit(0);}
//////////////////////////////////////
//        else if(cmdText.equals(filePrint))
//            JOptionPane.showMessageDialog(
//                    Notepad.this.f,
//                    "Get ur printer repaired first! It seems u dont have one!",
//                    "Bad Printer",
//                    JOptionPane.INFORMATION_MESSAGE
//            );
//////////////////////////////////////
//        else if(cmdText.equals(editCut))
//            ta.cut();
//////////////////////////////////////
//        else if(cmdText.equals(editCopy))
//            ta.copy();
//////////////////////////////////////
//        else if(cmdText.equals(editPaste))
//            ta.paste();
//////////////////////////////////////
//        else if(cmdText.equals(editDelete))
//            ta.replaceSelection("");
//////////////////////////////////////
//        else if(cmdText.equals(editFind))
//        {
//            if(Notepad.this.ta.getText().length()==0)
//                return; // text box have no text
//            if(findReplaceDialog==null)
//                findReplaceDialog=new FindDialog(Notepad.this.ta);
//            findReplaceDialog.showDialog(Notepad.this.f,true);//find
//        }
//////////////////////////////////////
//        else if(cmdText.equals(editFindNext))
//        {
//            if(Notepad.this.ta.getText().length()==0)
//                return; // text box have no text
//
//            if(findReplaceDialog==null)
//                statusBar.setText("Use Find option of Edit Menu first !!!!");
//            else
//                findReplaceDialog.findNextWithSelection();
//        }
//////////////////////////////////////
//        else if(cmdText.equals(editReplace))
//        {
//            if(Notepad.this.ta.getText().length()==0)
//                return; // text box have no text
//
//            if(findReplaceDialog==null)
//                findReplaceDialog=new FindDialog(Notepad.this.ta);
//            findReplaceDialog.showDialog(Notepad.this.f,false);//replace
//        }
//////////////////////////////////////
//        else if(cmdText.equals(editGoTo))
//        {
//            if(Notepad.this.ta.getText().length()==0)
//                return; // text box have no text
//            goTo();
//        }
//////////////////////////////////////
//        else if(cmdText.equals(editSelectAll))
//            ta.selectAll();
//////////////////////////////////////
//        else if(cmdText.equals(editTimeDate))
//            ta.insert(new Date().toString(),ta.getSelectionStart());
//////////////////////////////////////
//        else if(cmdText.equals(formatWordWrap))
//        {
//            JCheckBoxMenuItem temp=(JCheckBoxMenuItem)ev.getSource();
//            ta.setLineWrap(temp.isSelected());
//        }
//////////////////////////////////////
//        else if(cmdText.equals(formatFont))
//        {
//            if(fontDialog==null)
//                fontDialog=new FontChooser(ta.getFont());
//
//            if(fontDialog.showDialog(Notepad.this.f,"Choose a font"))
//                Notepad.this.ta.setFont(fontDialog.createFont());
//        }
//////////////////////////////////////
//        else if(cmdText.equals(formatForeground))
//            showForegroundColorDialog();
//////////////////////////////////////
//        else if(cmdText.equals(formatBackground))
//            showBackgroundColorDialog();
//////////////////////////////////////
//
//        else if(cmdText.equals(viewStatusBar))
//        {
//            JCheckBoxMenuItem temp=(JCheckBoxMenuItem)ev.getSource();
//            statusBar.setVisible(temp.isSelected());
//        }
//////////////////////////////////////
//        else if(cmdText.equals(helpAboutNotepad))
//        {
//            JOptionPane.showMessageDialog(Notepad.this.f,aboutText,"Dedicated 2 u!",
//                    JOptionPane.INFORMATION_MESSAGE);
//        }
//        else
//            statusBar.setText("This "+cmdText+" command is yet to be implemented");
//    }//action Performed
//    ////////////////////////////////////
//    void showBackgroundColorDialog()
//    {
//        if(bcolorChooser==null)
//            bcolorChooser=new JColorChooser();
//        if(backgroundDialog==null)
//            backgroundDialog=JColorChooser.createDialog
//                    (Notepad.this.f,
//                            formatBackground,
//                            false,
//                            bcolorChooser,
//                            new ActionListener()
//                            {public void actionPerformed(ActionEvent evvv){
//                                Notepad.this.ta.setBackground(bcolorChooser.getColor());}},
//                            null);
//
//        backgroundDialog.setVisible(true);
//    }
//    ////////////////////////////////////
//    void showForegroundColorDialog()
//    {
//        if(fcolorChooser==null)
//            fcolorChooser=new JColorChooser();
//        if(foregroundDialog==null)
//            foregroundDialog=JColorChooser.createDialog
//                    (Notepad.this.f,
//                            formatForeground,
//                            false,
//                            fcolorChooser,
//                            new ActionListener()
//                            {public void actionPerformed(ActionEvent evvv){
//                                Notepad.this.ta.setForeground(fcolorChooser.getColor());}},
//                            null);
//
//        foregroundDialog.setVisible(true);
//    }
//
//    ///////////////////////////////////
//    JMenuItem createMenuItem(String s, int key,JMenu toMenu,ActionListener al)
//    {
//        JMenuItem temp=new JMenuItem(s,key);
//        temp.addActionListener(al);
//        toMenu.add(temp);
//
//        return temp;
//    }
//    ////////////////////////////////////
//    JMenuItem createMenuItem(String s, int key,JMenu toMenu,int aclKey,ActionListener al)
//    {
//        JMenuItem temp=new JMenuItem(s,key);
//        temp.addActionListener(al);
//        temp.setAccelerator(KeyStroke.getKeyStroke(aclKey,ActionEvent.CTRL_MASK));
//        toMenu.add(temp);
//
//        return temp;
//    }
//    ////////////////////////////////////
//    JCheckBoxMenuItem createCheckBoxMenuItem(String s,
//                                             int key,JMenu toMenu,ActionListener al)
//    {
//        JCheckBoxMenuItem temp=new JCheckBoxMenuItem(s);
//        temp.setMnemonic(key);
//        temp.addActionListener(al);
//        temp.setSelected(false);
//        toMenu.add(temp);
//
//        return temp;
//    }
//    ////////////////////////////////////
//    JMenu createMenu(String s,int key,JMenuBar toMenuBar)
//    {
//        JMenu temp=new JMenu(s);
//        temp.setMnemonic(key);
//        toMenuBar.add(temp);
//        return temp;
//    }
//    /*********************************/
//    void createMenuBar(JFrame f)
//    {
//        JMenuBar mb=new JMenuBar();
//        JMenuItem temp;
//
//        JMenu fileMenu=createMenu(fileText,KeyEvent.VK_F,mb);
//        JMenu editMenu=createMenu(editText,KeyEvent.VK_E,mb);
//        JMenu formatMenu=createMenu(formatText,KeyEvent.VK_O,mb);
//        JMenu viewMenu=createMenu(viewText,KeyEvent.VK_V,mb);
//        JMenu helpMenu=createMenu(helpText,KeyEvent.VK_H,mb);
//
//        createMenuItem(fileNew,KeyEvent.VK_N,fileMenu,KeyEvent.VK_N,this);
//        createMenuItem(fileOpen,KeyEvent.VK_O,fileMenu,KeyEvent.VK_O,this);
//        createMenuItem(fileSave,KeyEvent.VK_S,fileMenu,KeyEvent.VK_S,this);
//        createMenuItem(fileSaveAs,KeyEvent.VK_A,fileMenu,this);
//        fileMenu.addSeparator();
//        temp=createMenuItem(filePageSetup,KeyEvent.VK_U,fileMenu,this);
//        temp.setEnabled(false);
//        createMenuItem(filePrint,KeyEvent.VK_P,fileMenu,KeyEvent.VK_P,this);
//        fileMenu.addSeparator();
//        createMenuItem(fileExit,KeyEvent.VK_X,fileMenu,this);
//
//        temp=createMenuItem(editUndo,KeyEvent.VK_U,editMenu,KeyEvent.VK_Z,this);
//        temp.setEnabled(false);
//        editMenu.addSeparator();
//        cutItem=createMenuItem(editCut,KeyEvent.VK_T,editMenu,KeyEvent.VK_X,this);
//        copyItem=createMenuItem(editCopy,KeyEvent.VK_C,editMenu,KeyEvent.VK_C,this);
//        createMenuItem(editPaste,KeyEvent.VK_P,editMenu,KeyEvent.VK_V,this);
//        deleteItem=createMenuItem(editDelete,KeyEvent.VK_L,editMenu,this);
//        deleteItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0));
//        editMenu.addSeparator();
//        findItem=createMenuItem(editFind,KeyEvent.VK_F,editMenu,KeyEvent.VK_F,this);
//        findNextItem=createMenuItem(editFindNext,KeyEvent.VK_N,editMenu,this);
//        findNextItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F3,0));
//        replaceItem=createMenuItem(editReplace,KeyEvent.VK_R,editMenu,KeyEvent.VK_H,this);
//        gotoItem=createMenuItem(editGoTo,KeyEvent.VK_G,editMenu,KeyEvent.VK_G,this);
//        editMenu.addSeparator();
//        selectAllItem=createMenuItem(editSelectAll,KeyEvent.VK_A,editMenu,KeyEvent.VK_A,this);
//        createMenuItem(editTimeDate,KeyEvent.VK_D,editMenu,this)
//                .setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_F5,0));
//
//        createCheckBoxMenuItem(formatWordWrap,KeyEvent.VK_W,formatMenu,this);
//
//        createMenuItem(formatFont,KeyEvent.VK_F,formatMenu,this);
//        formatMenu.addSeparator();
//        createMenuItem(formatForeground,KeyEvent.VK_T,formatMenu,this);
//        createMenuItem(formatBackground,KeyEvent.VK_P,formatMenu,this);
//
//        createCheckBoxMenuItem(viewStatusBar,KeyEvent.VK_S,viewMenu,this).setSelected(true);
///************For Look and Feel***/
//        LookAndFeelMenu.createLookAndFeelMenuItem(viewMenu,this.f);
//
//
//        temp=createMenuItem(helpHelpTopic,KeyEvent.VK_H,helpMenu,this);
//        temp.setEnabled(false);
//        helpMenu.addSeparator();
//        createMenuItem(helpAboutNotepad,KeyEvent.VK_A,helpMenu,this);
//
//        MenuListener editMenuListener=new MenuListener()
//        {
//            public void menuSelected(MenuEvent evvvv)
//            {
//                if(Notepad.this.ta.getText().length()==0)
//                {
//                    findItem.setEnabled(false);
//                    findNextItem.setEnabled(false);
//                    replaceItem.setEnabled(false);
//                    selectAllItem.setEnabled(false);
//                    gotoItem.setEnabled(false);
//                }
//                else
//                {
//                    findItem.setEnabled(true);
//                    findNextItem.setEnabled(true);
//                    replaceItem.setEnabled(true);
//                    selectAllItem.setEnabled(true);
//                    gotoItem.setEnabled(true);
//                }
//                if(Notepad.this.ta.getSelectionStart()==ta.getSelectionEnd())
//                {
//                    cutItem.setEnabled(false);
//                    copyItem.setEnabled(false);
//                    deleteItem.setEnabled(false);
//                }
//                else
//                {
//                    cutItem.setEnabled(true);
//                    copyItem.setEnabled(true);
//                    deleteItem.setEnabled(true);
//                }
//            }
//            public void menuDeselected(MenuEvent evvvv){}
//            public void menuCanceled(MenuEvent evvvv){}
//        };
//        editMenu.addMenuListener(editMenuListener);
//        f.setJMenuBar(mb);
//    }
//    /*************Constructor**************/
//////////////////////////////////////
//    public static void main(String[] s)
//    {
//        new Notepad();
//    }
//}
///**************************************/
////public
//interface MenuConstants
//{
//    final String fileText="File";
//    final String editText="Edit";
//    final String formatText="Format";
//    final String viewText="View";
//    final String helpText="Help";
//
//    final String fileNew="New";
//    final String fileOpen="Open...";
//    final String fileSave="Save";
//    final String fileSaveAs="Save As...";
//    final String filePageSetup="Page Setup...";
//    final String filePrint="Print";
//    final String fileExit="Exit";
//
//    final String editUndo="Undo";
//    final String editCut="Cut";
//    final String editCopy="Copy";
//    final String editPaste="Paste";
//    final String editDelete="Delete";
//    final String editFind="Find...";
//    final String editFindNext="Find Next";
//    final String editReplace="Replace";
//    final String editGoTo="Go To...";
//    final String editSelectAll="Select All";
//    final String editTimeDate="Time/Date";
//
//    final String formatWordWrap="Word Wrap";
//    final String formatFont="Font...";
//    final String formatForeground="Set Text color...";
//    final String formatBackground="Set Pad color...";
//
//    final String viewStatusBar="Status Bar";
//
//    final String helpHelpTopic="Help Topic";
//    final String helpAboutNotepad="About Javapad";
//
//    final String aboutText="Your Javapad";
//}
